home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / x / volume11 / xdvi / patch11.02 < prev    next >
Encoding:
Internet Message Format  |  1991-02-12  |  44.2 KB

  1. Path: uunet!olivea!apple!sun-barr!newstop!exodus!math.berkeley.edu
  2. From: vojta@math.berkeley.edu (Paul Vojta)
  3. Newsgroups: comp.sources.x
  4. Subject: v11i060: xdvi, Patch11, Part02/02
  5. Message-ID: <7930@exodus.Eng.Sun.COM>
  6. Date: 13 Feb 91 07:10:26 GMT
  7. References: <csx-11i059:xdvi@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1414
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: vojta@math.berkeley.edu (Paul Vojta)
  13. Posting-number: Volume 11, Issue 60
  14. Archive-name: xdvi/patch11.02
  15. Patch-To: xdvi: Volume 3, Issues 37-39
  16. Patch-To: xdvi: Volume 4, Issue 44 (xdvi, Patch4)
  17. Patch-To: xdvi: Volume 4, Issue 96 (xdvi, dvi previewer, Patch5)
  18. Patch-To: xdvi: Volume 5, Issue 35 (xdvi, dvi previewer, patch 6, part 1/2)
  19. Patch-To: xdvi: Volume 5, Issue 36 (xdvi, dvi previewer, patch 6, part 2/2)
  20. Patch-To: xdvi: Volume 6, Issue  5 (xdvi, Patch7)
  21. Patch-To: xdvi: Volume 6, Issue 49 (xdvi, dvi previewer, patch 8)
  22. Patch-To: xdvi: Volume 7, Issue 52 (xdvi, dvi previewer, patch 9, part 1/2)
  23. Patch-To: xdvi: Volume 7, Issue 53 (xdvi, dvi previewer, patch 9, part 2/2)
  24. Patch-To: xdvi: Volume 10, Issue 9 (xdvi, patch10, part01/02)
  25. Patch-To: xdvi: Volume 10, Issue 10 (xdvi, patch10, part02/02)
  26.  
  27. -- cut here --
  28. diff -cr old/pxl_open.c new/pxl_open.c
  29. *** old/pxl_open.c    Sun Oct 21 14:47:37 1990
  30. --- new/pxl_open.c    Sat Feb  2 16:28:32 1991
  31. ***************
  32. *** 1,5 ****
  33.   /*
  34. !  *    pxl_open.c(font, font_ret, mag, mag_ret, factor, name)
  35.    *    Find and open gf, pk, or pxl files in the given path, having the given
  36.    *    name and magnification.  It tries gf files first, followed by pk and pxl
  37.    *    files.  The path variable should be of the form path1:path2:...:pathn,
  38. --- 1,5 ----
  39.   /*
  40. !  *    pxl_open.c(font, font_ret, mag, mag_ret, name)
  41.    *    Find and open gf, pk, or pxl files in the given path, having the given
  42.    *    name and magnification.  It tries gf files first, followed by pk and pxl
  43.    *    files.  The path variable should be of the form path1:path2:...:pathn,
  44. ***************
  45. *** 11,23 ****
  46.    *    and if it fails then the procedure will try changing the point size
  47.    *    as well.  If all of the above fails, then alt_font will be tried.
  48.    *
  49.    *    If the file is found, then a file pointer is returned, and the following
  50.    *    values are set:
  51.    *        *font_ret  a pointer to a string containing the font name (if
  52.    *            different from the font requested).
  53.    *        *mag_ret  the actual magnification found.
  54. -  *        *factor    the ratio of the point sizes of the requested font
  55. -  *            and the font actually found (or 1.0 if altfont is used).
  56.    *        *name    a pointer to a string containing the file name
  57.    *
  58.    *    If the file is not found, then the return value is NULL.
  59. --- 11,30 ----
  60.    *    and if it fails then the procedure will try changing the point size
  61.    *    as well.  If all of the above fails, then alt_font will be tried.
  62.    *
  63. +  *    If the variable SEARCH_SUBDIRECTORIES is set, then the environment
  64. +  *    variable TEXFONTS_SUBDIR and the #define variable DEFAULT_SUBDIR_PATH
  65. +  *    will be enabled, as well as ``*'' and ``**'' specifiers.  The
  66. +  *    SUBDIR_PATH things will be appended to the end of the usual path, with
  67. +  *    a `*' at the end of each component.  The `*' means that subdirectories
  68. +  *    will be searched up to one level; `**' means that subdirectories
  69. +  *    will be recursively searched to any level.  Neither specifier may be
  70. +  *    preceded by a `%' specifier (after the most recent colon).
  71. +  *
  72.    *    If the file is found, then a file pointer is returned, and the following
  73.    *    values are set:
  74.    *        *font_ret  a pointer to a string containing the font name (if
  75.    *            different from the font requested).
  76.    *        *mag_ret  the actual magnification found.
  77.    *        *name    a pointer to a string containing the file name
  78.    *
  79.    *    If the file is not found, then the return value is NULL.
  80. ***************
  81. *** 49,65 ****
  82.   
  83.   static    char    *font_path;
  84.   static    char    *default_font_path    = DEFAULT_FONT_PATH;
  85.   static    int    *sizes, *sizend;
  86.   static    char    default_size_list[]    = DEFAULT_FONT_SIZES;
  87.   
  88.   #ifdef    sun
  89.   char    *sprintf();
  90.   #endif
  91.   
  92. ! char    *malloc(), *getenv();
  93.   double    atof();
  94.   
  95.   static    void
  96.   get_sizes(size_list, spp)
  97.       char    *size_list;
  98.       int    **spp;
  99. --- 56,306 ----
  100.   
  101.   static    char    *font_path;
  102.   static    char    *default_font_path    = DEFAULT_FONT_PATH;
  103. + #ifdef    SEARCH_SUBDIRECTORIES
  104. + static    char    default_subdir_path[]    = DEFAULT_SUBDIR_PATH;
  105. + #endif
  106.   static    int    *sizes, *sizend;
  107.   static    char    default_size_list[]    = DEFAULT_FONT_SIZES;
  108.   
  109. + #define    FILENAMESIZE 512
  110.   #ifdef    sun
  111.   char    *sprintf();
  112.   #endif
  113.   
  114. ! char    *xmalloc(), *getenv();
  115.   double    atof();
  116. + void    exit();
  117.   
  118. + #ifdef    SEARCH_SUBDIRECTORIES
  119. + /* We will need some system include files to deal with directories.  */
  120. + /* <sys/types.h> was included by xdvi.h.  */
  121. + #include <sys/stat.h>
  122. + static    int    is_dir ();
  123. + #if    defined(SYSV) || defined(_POSIX_SOURCE)
  124. + #include <dirent.h>
  125. + typedef struct dirent *directory_entry_type;
  126. + #else
  127. + #include <sys/dir.h>
  128. + typedef struct direct *directory_entry_type;
  129. + #endif
  130. + /* Declare the routine to get the current working directory.  */
  131. + #ifdef    HAVE_GETWD
  132. + extern char *getwd ();
  133. + #define    getcwd(b, len)    ((b) ? getwd (b) : getwd (xmalloc (len, "getwd")))
  134. + #else
  135. + #ifdef    ANSI
  136. + extern char *getcwd (char *, int);
  137. + #else
  138. + extern char *getcwd ();
  139. + #endif    /* not ANSI */
  140. + #endif    /* not HAVE_GETWD */
  141. + char    *cwd;
  142. + /* The following is a data structure containing the precomputed names of
  143. +    subdirectories to be recursively searched. */
  144. + static    struct subdir_entry {
  145. +     char    *name;        /* partial string */
  146. +     char    *index;        /* reference point in {,default_}font_path */
  147. +     struct subdir_entry *next;    /* link in list */
  148. + }
  149. +     *subdir_head    = NULL,
  150. +     *next_subdir;
  151. + #ifndef    S_ISDIR
  152. + #define    S_ISDIR(m)    ((m & S_IFMT) == S_IFDIR)
  153. + #endif
  154. + /* Return true if FN is a directory or a symlink to a directory,
  155. +    false if not. */
  156. + static    int
  157. + is_dir (fn)
  158. +   char *fn;
  159. + {
  160. +   struct stat stats;
  161. +   return stat (fn, &stats) == 0 && S_ISDIR (stats.st_mode);
  162. + }
  163. + /*
  164. +  *    Compute extra length of subdirectory entries, including a star for each.
  165. +  */
  166. + static    int
  167. + extra_len(str1, str2)
  168. +     char *str1, *str2;
  169. + {
  170. +     int    bias    = 0;
  171. +     char    *p    = str1;
  172. +     char    *q;
  173. +     do {
  174. +         q = index(p, PATH_SEP);
  175. +         if (q == NULL) q = p + strlen(p);
  176. +         if (q == p) {
  177. +         if (str2 != NULL) {
  178. +             bias += extra_len(str2, (char *) NULL);
  179. +             str2 = NULL;
  180. +         }
  181. +         }
  182. +         else ++bias;    /* don't forget the star */
  183. +         p = q + 1;
  184. +     }
  185. +     while (p[-1] != '\0');
  186. +     return bias + p - str1;
  187. + }
  188. + /*
  189. +  *    Add the specifiers (and double stars) for the given strings (user
  190. +  *    string, plus default string) to the destination string.
  191. +  */
  192.   static    void
  193. + add_subdir_paths(dst, dst_first, src, src_default)
  194. +     char *dst, *dst_first, *src, *src_default;
  195. + {
  196. +     char    *q;
  197. +     do {
  198. +         q = index(src, PATH_SEP);
  199. +         if (q == NULL) q = src + strlen(src);
  200. +         if (q == src) {
  201. +         if (src_default != NULL) {
  202. +             add_subdir_paths(dst, dst_first, src_default, (char *)NULL);
  203. +             dst += strlen(dst);
  204. +             src_default = NULL;
  205. +         }
  206. +         }
  207. +         else {
  208. +         if (dst != dst_first) *dst++ = PATH_SEP;
  209. +         bcopy(src, dst, q - src);
  210. +         dst += q - src;
  211. +         *dst++ = '*';
  212. +         }
  213. +         src = q + 1;
  214. +     }
  215. +     while (src[-1] != '\0');
  216. +     *dst = '\0';
  217. + }
  218. + /*
  219. +  *    Make a subdirectory entry.
  220. +  */
  221. + static    struct subdir_entry *
  222. + make_subdir_entry(index, name)
  223. +     char *index, *name;
  224. + {
  225. +     struct subdir_entry *new_entry;
  226. +     static    struct subdir_entry    **subdir_tail = &subdir_head;
  227. +     *subdir_tail = new_entry = (struct subdir_entry *)
  228. +         xmalloc(sizeof(struct subdir_entry), "subdirectory list entry");
  229. +     subdir_tail = &(new_entry->next);
  230. +     new_entry->name = strcpy(xmalloc(strlen(name) + 1,
  231. +         "subdirectory entry string"), name);
  232. +     new_entry->index = index;
  233. +     new_entry->next = NULL;
  234. +     return new_entry;
  235. + }
  236. + /*
  237. +  *    Create the subdirectory linked list for the given initial string
  238. +  */
  239. + static    void
  240. + add_subdirs(str, len, recurs)
  241. +     char *str;
  242. +     int len;
  243. +     Boolean recurs;
  244. + {
  245. +     int    len1 = len;
  246. +     char    temp[FILENAMESIZE];
  247. +     struct subdir_entry *next_subdir;
  248. +     DIR    *dir;
  249. +     directory_entry_type    e;
  250. +     bcopy(str, temp, len);
  251. +     if (len > 0 && temp[len - 1] != '/') temp[len1++] = '/';
  252. +     temp[len1] = '\0';
  253. +     next_subdir = make_subdir_entry(str, temp + len);
  254. +     do {
  255. +         /* By changing directories, we save a bunch of string
  256. +            concatenations (and make the pathnames the kernel looks up
  257. +            shorter).  */
  258. +         Strcpy(temp + len, next_subdir->name);
  259. +         if (chdir (temp) != 0) continue;
  260. +         dir = opendir (".");
  261. +         if (dir == NULL) continue;
  262. +         len1 = strlen(temp);
  263. +         if (len1 == 0 || temp[len1 - 1] != '/') temp[len1++] = '/';
  264. +         while ((e = readdir (dir)) != NULL)
  265. +           {
  266. +         if (is_dir (e->d_name) && strcmp (e->d_name, ".") != 0
  267. +             && strcmp (e->d_name, "..") != 0)
  268. +           {
  269. +             Strcpy(temp + len1, e->d_name);
  270. +             (void) make_subdir_entry(str, temp + len);
  271. +           }
  272. +           }
  273. +         (void) closedir (dir);
  274. +         /* Change back to the current directory, in case the path
  275. +            contains relative directory names.  */
  276. +         if (chdir (cwd) != 0) {
  277. +         perror (cwd);
  278. +         exit (errno);
  279. +         }
  280. +     }
  281. +     while (recurs && (next_subdir = next_subdir->next) != NULL);
  282. + }
  283. + /*
  284. +  *    Recursively figure out the subdirectory tree and precompute the
  285. +  *    list of subdirectories to search.
  286. +  */
  287. + static    void
  288. + compute_subdir_paths(fp, fp_default)
  289. +     char *fp, *fp_default;
  290. + {
  291. +     char    *star_loc = NULL;
  292. +     char    *endp;
  293. +     do {
  294. +         if (star_loc == NULL) {
  295. +         star_loc = index(fp, '*');
  296. +         if (star_loc == NULL) star_loc = fp + strlen(fp);
  297. +         }
  298. +         endp = index(fp, PATH_SEP);
  299. +         if (endp == NULL) endp = fp + strlen(fp);
  300. +         if (endp == fp) {
  301. +         if (fp_default != NULL) {
  302. +             compute_subdir_paths(fp_default, (char *) NULL);
  303. +             fp_default = NULL;
  304. +         }
  305. +         }
  306. +         else if (star_loc < endp) {
  307. +         add_subdirs(fp, star_loc - fp, star_loc[1] == '*');
  308. +         star_loc = NULL;
  309. +         }
  310. +         fp = endp + 1;
  311. +     }
  312. +     while (fp[-1] != '\0');
  313. + }
  314. + #endif    /* SEARCH_SUBDIRECTORIES */
  315. + static    void
  316.   get_sizes(size_list, spp)
  317.       char    *size_list;
  318.       int    **spp;
  319. ***************
  320. *** 79,90 ****
  321.       int    *sp, *sp1, *sp2;
  322.       unsigned int n;
  323.       char    *p;
  324.   
  325. !     if ((font_path = getenv("XDVIFONTS")) == NULL) {
  326.           font_path = default_font_path;
  327.           default_font_path = NULL;
  328.       }
  329.   
  330.       size_list = getenv("XDVISIZES");
  331.       n = 1;    /* count number of sizes */
  332.       if (size_list == NULL || *size_list == PATH_SEP)
  333. --- 320,360 ----
  334.       int    *sp, *sp1, *sp2;
  335.       unsigned int n;
  336.       char    *p;
  337. + #ifdef    SEARCH_SUBDIRECTORIES
  338. +     char    *q;
  339. + #endif
  340.   
  341. !     if ((font_path = getenv("XDVIFONTS")) == NULL
  342. !         && (font_path = getenv("TEXFONTS")) == NULL) {
  343.           font_path = default_font_path;
  344.           default_font_path = NULL;
  345.       }
  346.   
  347. + #ifdef    SEARCH_SUBDIRECTORIES
  348. +     p = getenv ("TEXFONTS_SUBDIR");
  349. +     if (p == NULL) p = "";
  350. +     q = xmalloc((unsigned) strlen(font_path)
  351. +         + extra_len(p, default_subdir_path) + 1,
  352. +         "initializing font searching");
  353. +     Strcpy(q, font_path);
  354. +     add_subdir_paths(q + strlen(q), q, p, default_subdir_path);
  355. +     font_path = q;
  356. +     /* Unfortunately, we can't look in the environment for the current
  357. +        directory, because if we are running under a program (let's say
  358. +        Emacs), the PWD variable might have been set by Emacs' parent
  359. +        to the current directory at the time Emacs was invoked.  This
  360. +        is not necessarily the same directory the user expects to be
  361. +        in.  So, we must always call getcwd(3) or getwd(3), even though
  362. +        they are slow and prone to hang in networked installations.  */
  363. +     cwd = getcwd ((char *) NULL, FILENAMESIZE + 2);
  364. +     if (cwd == NULL) {
  365. +         perror ("getcwd");
  366. +         exit (errno);
  367. +     }
  368. +     compute_subdir_paths(font_path, default_font_path);
  369. + #endif
  370.       size_list = getenv("XDVISIZES");
  371.       n = 1;    /* count number of sizes */
  372.       if (size_list == NULL || *size_list == PATH_SEP)
  373. ***************
  374. *** 92,98 ****
  375.           ++n;
  376.       if (size_list != NULL)
  377.           for (p = size_list; (p = index(p, PATH_SEP)) != NULL; ++p) ++n;
  378. !     sizes = (int *) malloc(n * sizeof(int));
  379.       sizend = sizes + n;
  380.       sp = sizes;    /* get the actual sizes */
  381.       if (size_list == NULL || *size_list == PATH_SEP)
  382. --- 362,368 ----
  383.           ++n;
  384.       if (size_list != NULL)
  385.           for (p = size_list; (p = index(p, PATH_SEP)) != NULL; ++p) ++n;
  386. !     sizes = (int *) xmalloc(n * sizeof(int), "size list");
  387.       sizend = sizes + n;
  388.       sp = sizes;    /* get the actual sizes */
  389.       if (size_list == NULL || *size_list == PATH_SEP)
  390. ***************
  391. *** 122,128 ****
  392.       int    count;
  393.   {
  394.       char    *p = path,
  395. !         nm[128],
  396.           *n = nm,
  397.           c;
  398.       Boolean    f_used = False;
  399. --- 392,398 ----
  400.       int    count;
  401.   {
  402.       char    *p = path,
  403. !         nm[FILENAMESIZE],
  404.           *n = nm,
  405.           c;
  406.       Boolean    f_used = False;
  407. ***************
  408. *** 129,134 ****
  409. --- 399,418 ----
  410.       Boolean    p_used = False;
  411.       FILE    *f;
  412.   
  413. + #ifdef    SEARCH_SUBDIRECTORIES
  414. +     if (next_subdir != NULL && next_subdir->index == p) {
  415. +         int len = index(p, '*') - p;
  416. +         bcopy(p, n, len);
  417. +         p += len;
  418. +         n += len;
  419. +         Strcpy(n, next_subdir->name);
  420. +         n += strlen(n);
  421. +         ++p;
  422. +         if (*p == '*') ++p;
  423. +         if (*p != '/') *n++ = '/';
  424. +     }
  425. + #endif
  426.       for (;;) {
  427.           c = *p++;
  428.           if (c==PATH_SEP || c=='\0') {
  429. ***************
  430. *** 168,174 ****
  431.           f = fopen(nm, OPEN_MODE);
  432.       }
  433.       if (f != NULL) {
  434. !         *name = malloc((unsigned) (n - nm + 1));
  435.           Strcpy(*name, nm);
  436.       }
  437.       return f;
  438. --- 452,458 ----
  439.           f = fopen(nm, OPEN_MODE);
  440.       }
  441.       if (f != NULL) {
  442. !         *name = xmalloc((unsigned) (n - nm + 1), "font file name");
  443.           Strcpy(*name, nm);
  444.       }
  445.       return f;
  446. ***************
  447. *** 185,191 ****
  448.       char    **name;
  449.       char    *font_path, *default_font_path;
  450.   {
  451. !     char    *p;
  452.       FILE    *f;
  453.       int    pkmag    = (pxlmag + 2) / 5;
  454.   
  455. --- 469,475 ----
  456.       char    **name;
  457.       char    *font_path, *default_font_path;
  458.   {
  459. !     char    *p    = font_path;
  460.       FILE    *f;
  461.       int    pkmag    = (pxlmag + 2) / 5;
  462.   
  463. ***************
  464. *** 192,201 ****
  465.       /*
  466.        * loop over paths
  467.        */
  468. !     for (p = font_path;; ++p) {
  469.           int count = 0;
  470.   
  471. !         if (*p == ':' || *p == '\0') {
  472.           if (default_font_path != NULL &&
  473.               (f = try_size(font, pxlmag, name, default_font_path,
  474.               (char *) NULL)) != NULL)
  475. --- 476,488 ----
  476.       /*
  477.        * loop over paths
  478.        */
  479. ! #ifdef    SEARCH_SUBDIRECTORIES
  480. !     next_subdir = subdir_head;
  481. ! #endif
  482. !     for (;;) {
  483.           int count = 0;
  484.   
  485. !         if (*p == PATH_SEP || *p == '\0') {
  486.           if (default_font_path != NULL &&
  487.               (f = try_size(font, pxlmag, name, default_font_path,
  488.               (char *) NULL)) != NULL)
  489. ***************
  490. *** 215,222 ****
  491. --- 502,516 ----
  492.           (f = formatted_open(p, font, "pxl", pxlmag, name, count++))
  493.               != NULL)
  494.               return f;
  495. + #ifdef    SEARCH_SUBDIRECTORIES
  496. +         if (next_subdir != NULL && next_subdir->index == p) {
  497. +         next_subdir = next_subdir->next;
  498. +         if (next_subdir != NULL && next_subdir->index == p) continue;
  499. +         }
  500. + #endif
  501.           p = index(p, PATH_SEP);
  502.           if (p == NULL) break;
  503. +         ++p;
  504.       }
  505.       return NULL;
  506.   }
  507. ***************
  508. *** 234,251 ****
  509.   {
  510.       FILE    *f;
  511.       int    *p1, *p2, pxlmag;
  512.   
  513.       /*
  514.        * Loop over sizes.  Try actual size first, then closest sizes.
  515.        */
  516.       pxlmag = mag + 0.5;
  517. !     if ((f = try_size(font, *mag_ret = pxlmag, name, font_path,
  518.           default_font_path)) != NULL)
  519.           return f;
  520.       if (pxlmag < mag) ++pxlmag; else --pxlmag;
  521. !     if ((f = try_size(font, *mag_ret = pxlmag, name, font_path,
  522.           default_font_path)) != NULL)
  523.           return f;
  524.       for (p2 = sizes; p2 < sizend; ++p2) if (*p2 >= mag) break;
  525.       p1 = p2;
  526.       for (;;) {
  527. --- 528,562 ----
  528.   {
  529.       FILE    *f;
  530.       int    *p1, *p2, pxlmag;
  531. +     char    *path_to_use = font_path;
  532.   
  533.       /*
  534.        * Loop over sizes.  Try actual size first, then closest sizes.
  535. +        If the pathname is absolutely or explicitly relative, don't
  536. +        use the usual paths to search for it; just look for it in the
  537. +        directory specified.
  538.        */
  539.       pxlmag = mag + 0.5;
  540. ! #ifndef    VMS
  541. !     if (*font == '/') path_to_use = "/";
  542. !     else if (*font == '.' && (*(font + 1) == '/'
  543. !         || (*(font + 1) == '.' && *(font + 2) == '/')))
  544. !         path_to_use = ".";
  545. ! #endif
  546. !     if ((f = try_size(font, *mag_ret = pxlmag, name, path_to_use,
  547.           default_font_path)) != NULL)
  548.           return f;
  549. +     /* Try at one away from the size we just tried, to account
  550. +        for rounding error.  */
  551.       if (pxlmag < mag) ++pxlmag; else --pxlmag;
  552. !     if ((f = try_size(font, *mag_ret = pxlmag, name, path_to_use,
  553.           default_font_path)) != NULL)
  554.           return f;
  555. +     /* Now try at all the sizes. */
  556.       for (p2 = sizes; p2 < sizend; ++p2) if (*p2 >= mag) break;
  557.       p1 = p2;
  558.       for (;;) {
  559. ***************
  560. *** 256,262 ****
  561.           else if (p2 >= sizend || mag * mag <= p1[-1] * *p2)
  562.               pxlmag = *--p1;
  563.           else pxlmag = *p2++;
  564. !         if ((f = try_size(font, *mag_ret = pxlmag, name, font_path,
  565.               default_font_path)) != NULL)
  566.           return f;
  567.       }
  568. --- 567,573 ----
  569.           else if (p2 >= sizend || mag * mag <= p1[-1] * *p2)
  570.               pxlmag = *--p1;
  571.           else pxlmag = *p2++;
  572. !         if ((f = try_size(font, *mag_ret = pxlmag, name, path_to_use,
  573.               default_font_path)) != NULL)
  574.           return f;
  575.       }
  576. ***************
  577. *** 263,273 ****
  578.   }
  579.   
  580.   FILE *
  581. ! pxl_open(font, font_ret, mag, mag_ret, factor, name)
  582.       char    *font, **font_ret;
  583.       float    mag;
  584.       int    *mag_ret;
  585. -     float    *factor;
  586.       char    **name;
  587.   {
  588.       FILE    *f;
  589. --- 574,583 ----
  590.   }
  591.   
  592.   FILE *
  593. ! pxl_open(font, font_ret, mag, mag_ret, name)
  594.       char    *font, **font_ret;
  595.       float    mag;
  596.       int    *mag_ret;
  597.       char    **name;
  598.   {
  599.       FILE    *f;
  600. ***************
  601. *** 274,280 ****
  602.       int    actual_pt, low_pt, high_pt, trial_pt;
  603.       char    fn[50], *fnend;
  604.   
  605. -     *factor = 1.0;
  606.       f = pre_pxl_open(font, mag, mag_ret, name);
  607.       if (f != NULL) {
  608.           *font_ret = NULL;
  609. --- 584,589 ----
  610. ***************
  611. *** 297,304 ****
  612.           Sprintf(fnend, "%d", trial_pt);
  613.           f = pre_pxl_open(fn, mag * actual_pt / trial_pt, mag_ret, name);
  614.           if (f != NULL) {
  615. !             *font_ret = strcpy(malloc((unsigned) strlen(fn) + 1), fn);
  616. !             *factor = (float) actual_pt / trial_pt;
  617.               return f;
  618.           }
  619.           }
  620. --- 606,613 ----
  621.           Sprintf(fnend, "%d", trial_pt);
  622.           f = pre_pxl_open(fn, mag * actual_pt / trial_pt, mag_ret, name);
  623.           if (f != NULL) {
  624. !             *font_ret = strcpy(xmalloc((unsigned) strlen(fn) + 1,
  625. !             "name of font used"), fn);
  626.               return f;
  627.           }
  628.           }
  629. ***************
  630. *** 307,313 ****
  631.           *font_ret = alt_font;
  632.           f = pre_pxl_open(alt_font, mag, mag_ret, name);
  633.           if (f != NULL)
  634. !         *font_ret = strcpy(malloc((unsigned) strlen(alt_font) + 1),
  635.               alt_font);
  636.       }
  637.       return f;
  638. --- 616,623 ----
  639.           *font_ret = alt_font;
  640.           f = pre_pxl_open(alt_font, mag, mag_ret, name);
  641.           if (f != NULL)
  642. !         *font_ret = strcpy(xmalloc((unsigned) strlen(alt_font) + 1,
  643. !             "name of font used"),
  644.               alt_font);
  645.       }
  646.       return f;
  647. diff -cr old/tpic.c new/tpic.c
  648. *** old/tpic.c    Sun Oct 21 14:47:54 1990
  649. --- new/tpic.c    Fri Dec  7 16:54:30 1990
  650. ***************
  651. *** 410,415 ****
  652.       else if (strcmp(command, "sh") == 0) shade_last();
  653.       else if (strcmp(command, "wh") == 0) whiten_last();
  654.       else if (strcmp(command, "bk") == 0) blacken_last();
  655. !     else if (spec_warn_now)
  656.       Fprintf(stderr, "%s:  special \"%s\" not implemented\n", prog, orig_cp);
  657.   }
  658. --- 410,415 ----
  659.       else if (strcmp(command, "sh") == 0) shade_last();
  660.       else if (strcmp(command, "wh") == 0) whiten_last();
  661.       else if (strcmp(command, "bk") == 0) blacken_last();
  662. !     else if (!hush_spec_now)
  663.       Fprintf(stderr, "%s:  special \"%s\" not implemented\n", prog, orig_cp);
  664.   }
  665. diff -cr old/xdvi.c new/xdvi.c
  666. *** old/xdvi.c    Sun Oct 21 14:49:08 1990
  667. --- new/xdvi.c    Mon Feb  4 13:05:55 1991
  668. ***************
  669. *** 116,121 ****
  670. --- 116,145 ----
  671.   #define    DPY    DISP,
  672.   static    Screen    *SCRN;
  673.   static    Cursor    redraw_cursor, ready_cursor;
  674. + #ifdef    VMS
  675. + /*
  676. +  * Magnifying glass cursor
  677. +  *
  678. +  * Developed by Tom Sawyer, April 1990
  679. +  * Contibuted by Hunter Goatley, January 1991
  680. +  *
  681. +  */
  682. + #define mag_glass_width 16
  683. + #define mag_glass_height 16
  684. + #define mag_glass_x_hot 6
  685. + #define mag_glass_y_hot 6
  686. + static char mag_glass_bits[] = {
  687. +     0xf8, 0x03, 0x0c, 0x06, 0xe2, 0x09, 0x13, 0x1a, 0x01, 0x14, 0x01, 0x14,
  688. +     0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x02, 0x18, 0x0c, 0x34,
  689. +     0xf8, 0x6f, 0x00, 0xd8, 0x00, 0xb0, 0x00, 0xe0
  690. + };
  691. + #include <decw$cursor.h>    /* Include the DECWindows cursor symbols */
  692. + static    int    DECWCursorFont;    /* Space for the DECWindows cursor font  */
  693. + static    Pixmap    MagnifyPixmap;    /* Pixmap to hold our special mag-glass  */
  694. + #endif    /* VMS */
  695.   #define    SetCursor(x)    XDefineCursor(DISP, WINDOW(mane), x)
  696.   #define    ClearPage(wr)    XClearWindow(DISP, WINDOW(wr));
  697.   #define    ClearArea(win, x, y, w, h)    XClearArea(DISP, win, x, y, w, h, False)
  698. ***************
  699. *** 160,166 ****
  700.   int    offset_x, offset_y;
  701.   int    unshrunk_paper_w, unshrunk_paper_h;
  702.   int    unshrunk_page_w, unshrunk_page_h;
  703. ! Boolean    spec_warn    = True;
  704.   static    char    *paper        = DEFAULT_PAPER;
  705.   static    char    *sidemargin, *topmargin;
  706.   static    char    *xoffset, *yoffset;
  707. --- 184,191 ----
  708.   int    offset_x, offset_y;
  709.   int    unshrunk_paper_w, unshrunk_paper_h;
  710.   int    unshrunk_page_w, unshrunk_page_h;
  711. ! Boolean    hush_spec    = False;
  712. ! Boolean    hush_chars    = False;
  713.   static    char    *paper        = DEFAULT_PAPER;
  714.   static    char    *sidemargin, *topmargin;
  715.   static    char    *xoffset, *yoffset;
  716. ***************
  717. *** 309,320 ****
  718.           {"Shrink2",    "sh2",        2 << 8 | 's',    200},
  719.           {"Shrink3",    "sh3",        3 << 8 | 's',    250},
  720.           {"Shrink4",    "sh4",        4 << 8 | 's',    300},
  721. !         {"Next",    "next",        'n',        400},
  722. !         {"Page+5",    "next5",    5 << 8 | 'n',    450},
  723. !         {"Page+10",    "next10",    10 << 8 | 'n',    500},
  724. !         {"Prev",    "prev",        'p',        600},
  725. !         {"Page-5",    "prev5",    5 << 8 | 'p',    650},
  726. !         {"Page-10",    "prev10",    10 << 8 | 'p',    700},
  727.   };
  728.   
  729.   static    void    handle_command();
  730. --- 334,345 ----
  731.           {"Shrink2",    "sh2",        2 << 8 | 's',    200},
  732.           {"Shrink3",    "sh3",        3 << 8 | 's',    250},
  733.           {"Shrink4",    "sh4",        4 << 8 | 's',    300},
  734. !         {"Page-10",    "prev10",    10 << 8 | 'p',    400},
  735. !         {"Page-5",    "prev5",    5 << 8 | 'p',    450},
  736. !         {"Prev",    "prev",        'p',        500},
  737. !         {"Next",    "next",        'n',        600},
  738. !         {"Page+5",    "next5",    5 << 8 | 'n',    650},
  739. !         {"Page+10",    "next10",    10 << 8 | 'n',    700},
  740.   };
  741.   
  742.   static    void    handle_command();
  743. ***************
  744. *** 415,421 ****
  745.   char    *sprintf();
  746.   #endif
  747.   
  748. - char    *malloc();
  749.   double    atof();
  750.   void    exit();
  751.   
  752. --- 440,445 ----
  753. ***************
  754. *** 1192,1197 ****
  755. --- 1216,1224 ----
  756.           case 'q':
  757.           case '\003':    /* control-C */
  758.           case '\004':    /* control-D */
  759. + #ifdef    VMS
  760. +         case '\032':    /* control-Z */
  761. + #endif
  762.           exit(0);
  763.           case 'n':
  764.           case 'f':
  765. ***************
  766. *** 1362,1368 ****
  767.       if (0 <= next_page && next_page < total_pages) {
  768.           if (current_page != next_page) {
  769.           current_page = next_page;
  770. !         spec_warn_now = spec_warn;
  771.           if (!keep_flag) home(False);
  772.           }
  773.           canit = True;
  774. --- 1389,1395 ----
  775.       if (0 <= next_page && next_page < total_pages) {
  776.           if (current_page != next_page) {
  777.           current_page = next_page;
  778. !         hush_spec_now = hush_spec;
  779.           if (!keep_flag) home(False);
  780.           }
  781.           canit = True;
  782. ***************
  783. *** 1629,1635 ****
  784.       }
  785.       else {
  786.           draw_page();
  787. !         spec_warn_now = False;
  788.       }
  789.   }
  790.   
  791. --- 1656,1662 ----
  792.       }
  793.       else {
  794.           draw_page();
  795. !         hush_spec_now = True;
  796.       }
  797.   }
  798.   
  799. ***************
  800. *** 1746,1756 ****
  801.   #ifndef    VMS
  802.   #ifdef    BUTTONS
  803.       Fputs("\
  804. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-sw]\n\
  805.       [-expert] [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  806. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>] [-rv]\
  807. ! \n\
  808. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>]\n\
  809.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  810.   [-cr <color>]\n\
  811.       [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
  812. --- 1773,1783 ----
  813.   #ifndef    VMS
  814.   #ifdef    BUTTONS
  815.       Fputs("\
  816. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-rv]\n\
  817.       [-expert] [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  818. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\n\
  819. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
  820. !     [-hushspecials] [-hushchars] [-hush]\n\
  821.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  822.   [-cr <color>]\n\
  823.       [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
  824. ***************
  825. *** 1758,1768 ****
  826.       stderr);
  827.   #else    /* !BUTTONS */
  828.       Fputs("\
  829. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-sw]\n\
  830.       [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  831. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>] [-rv]\
  832. ! \n\
  833. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>]\n\
  834.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  835.   [-cr <color>]\n\
  836.       [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
  837. --- 1785,1795 ----
  838.       stderr);
  839.   #else    /* !BUTTONS */
  840.       Fputs("\
  841. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-rv]\n\
  842.       [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  843. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\n\
  844. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
  845. !     [-hushspecials] [-hushchars] [-hush]\n\
  846.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  847.   [-cr <color>]\n\
  848.       [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
  849. ***************
  850. *** 1771,1795 ****
  851.   #endif    /* BUTTONS */
  852.   #else    /* VMS */
  853.       Fputs("\
  854. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-density <%>] [-p <pixels>] [-l] [-sw]\n\
  855.       [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  856. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>] [-rv]\
  857.   \n", stderr);
  858.       Fputs("\
  859. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>]\n\
  860.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  861.   [-cr <color>]\n\
  862.       [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
  863. !     [-iconic] [-display <host:display>] [-copy] [-thorough] dvi_file\n",
  864.       stderr);
  865.   #endif    /* VMS */
  866.   #else    /* X10 */
  867.       Fputs("\
  868. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-sw]\n\
  869.       [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  870. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>] [-rv]\
  871. ! \n\
  872. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>]\n\
  873.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  874.   [-cr <color>]\n\
  875.       [-bw <width>] [-geometry <geometry> | =<geometry>]\n\
  876. --- 1798,1823 ----
  877.   #endif    /* BUTTONS */
  878.   #else    /* VMS */
  879.       Fputs("\
  880. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-density <%>] [-p <pixels>] [-l] [-rv]\n\
  881.       [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  882. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\
  883.   \n", stderr);
  884.       Fputs("\
  885. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
  886. !     [-hushspecials] [-hushchars] [-hush]\n\
  887.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  888.   [-cr <color>]\n\
  889.       [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
  890. !     [-iconic] [-display <host::display>] [-copy] [-thorough] dvi_file\n",
  891.       stderr);
  892.   #endif    /* VMS */
  893.   #else    /* X10 */
  894.       Fputs("\
  895. ! Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l]\n\
  896.       [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
  897. !     [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\n\
  898. !     [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
  899. !     [-hushspecials] [-hushchars] [-hush]\n\
  900.       [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
  901.   [-cr <color>]\n\
  902.       [-bw <width>] [-geometry <geometry> | =<geometry>]\n\
  903. ***************
  904. *** 1838,1845 ****
  905.   {"-altfont",    ".altFont",    XrmoptionSepArg,    (caddr_t) NULL},
  906.   {"-l",        ".listFonts",    XrmoptionNoArg,        (caddr_t) "on"},
  907.   {"+l",        ".listFonts",    XrmoptionNoArg,        (caddr_t) "off"},
  908. ! {"-sw",        ".specialWarn",    XrmoptionNoArg,        (caddr_t) "on"},
  909. ! {"+sw",        ".specialWarn",    XrmoptionNoArg,        (caddr_t) "off"},
  910.   {"-fg",        ".foreground",    XrmoptionSepArg,    (caddr_t) NULL},
  911.   {"-foreground",    ".foreground",    XrmoptionSepArg,    (caddr_t) NULL},
  912.   {"-bg",        ".background",    XrmoptionSepArg,    (caddr_t) NULL},
  913. --- 1866,1877 ----
  914.   {"-altfont",    ".altFont",    XrmoptionSepArg,    (caddr_t) NULL},
  915.   {"-l",        ".listFonts",    XrmoptionNoArg,        (caddr_t) "on"},
  916.   {"+l",        ".listFonts",    XrmoptionNoArg,        (caddr_t) "off"},
  917. ! {"-hushspecials", ".hushSpecials", XrmoptionNoArg,    (caddr_t) "on"},
  918. ! {"+hushspecials", ".hushSpecials", XrmoptionNoArg,    (caddr_t) "off"},
  919. ! {"-hushchars",    ".hushLostChars", XrmoptionNoArg,    (caddr_t) "on"},
  920. ! {"+hushchars",    ".hushLostChars", XrmoptionNoArg,    (caddr_t) "off"},
  921. ! {"-hush",    ".Hush",    XrmoptionNoArg,        (caddr_t) "on"},
  922. ! {"+hush",    ".Hush",    XrmoptionNoArg,        (caddr_t) "off"},
  923.   {"-fg",        ".foreground",    XrmoptionSepArg,    (caddr_t) NULL},
  924.   {"-foreground",    ".foreground",    XrmoptionSepArg,    (caddr_t) NULL},
  925.   {"-bg",        ".background",    XrmoptionSepArg,    (caddr_t) NULL},
  926. ***************
  927. *** 1847,1852 ****
  928. --- 1879,1886 ----
  929.   {"-hl",        ".highlight",    XrmoptionSepArg,    (caddr_t) NULL},
  930.   {"-cr",        ".cursorColor",    XrmoptionSepArg,    (caddr_t) NULL},
  931.   {"-icongeometry",".iconGeometry",XrmoptionSepArg,    (caddr_t) NULL},
  932. + {"-keep",    ".keepPosition",XrmoptionNoArg,        (caddr_t) "on"},
  933. + {"+keep",    ".keepPosition",XrmoptionNoArg,        (caddr_t) "off"},
  934.   {"-copy",    ".copy",    XrmoptionNoArg,        (caddr_t) "on"},
  935.   {"+copy",    ".copy",    XrmoptionNoArg,        (caddr_t) "off"},
  936.   {"-thorough",    ".thorough",    XrmoptionNoArg,        (caddr_t) "on"},
  937. ***************
  938. *** 1888,1895 ****
  939.     (Cardinal) &list_fonts, XtRBoolean, (caddr_t) &list_fonts},
  940.   {"reverseVideo", "ReverseVideo", XtRBoolean, sizeof(Boolean),
  941.     (Cardinal) &reverse, XtRBoolean, (caddr_t) &reverse},
  942. ! {"specialWarn", "SpecialWarn", XtRBoolean, sizeof(Boolean),
  943. !   (Cardinal) &spec_warn, XtRBoolean, (caddr_t) &spec_warn},
  944.   {"foreground", "Foreground", XtRPixel, sizeof(Pixel),
  945.     (Cardinal)&fore_Pixel, XtRPixel, (caddr_t) &fore_Pixel},
  946.   {"foreground", "Foreground", XtRString, sizeof(char *),
  947. --- 1922,1931 ----
  948.     (Cardinal) &list_fonts, XtRBoolean, (caddr_t) &list_fonts},
  949.   {"reverseVideo", "ReverseVideo", XtRBoolean, sizeof(Boolean),
  950.     (Cardinal) &reverse, XtRBoolean, (caddr_t) &reverse},
  951. ! {"hushSpecials", "Hush", XtRBoolean, sizeof(Boolean),
  952. !   (Cardinal) &hush_spec, XtRBoolean, (caddr_t) &hush_spec},
  953. ! {"hushLostChars", "Hush", XtRBoolean, sizeof(Boolean),
  954. !   (Cardinal) &hush_chars, XtRBoolean, (caddr_t) &hush_chars},
  955.   {"foreground", "Foreground", XtRPixel, sizeof(Pixel),
  956.     (Cardinal)&fore_Pixel, XtRPixel, (caddr_t) &fore_Pixel},
  957.   {"foreground", "Foreground", XtRString, sizeof(char *),
  958. ***************
  959. *** 1912,1917 ****
  960. --- 1948,1955 ----
  961.     (Cardinal)&curs_color, XtRString, NULL},
  962.   {"iconGeometry", "IconGeometry", XtRString, sizeof(char *),
  963.     (Cardinal)&icon_geometry, XtRString, NULL},
  964. + {"keepPosition", "KeepPosition", XtRBoolean, sizeof(Boolean),
  965. +   (Cardinal)&keep_flag, XtRBoolean, (caddr_t) &keep_flag},
  966.   {"copy", "Copy", XtRBoolean, sizeof(Boolean),
  967.     (Cardinal)©, XtRBoolean, (caddr_t) ©},
  968.   {"thorough", "Thorough", XtRBoolean, sizeof(Boolean),
  969. ***************
  970. *** 1953,1958 ****
  971. --- 1991,1997 ----
  972.   static    char    *geometry;
  973.   static    char    *margins;
  974.   static    char    *offsets;
  975. + static    Boolean    hush;
  976.   
  977.   #ifndef X10
  978.   static    Boolean    iconic    = False;
  979. ***************
  980. *** 2012,2019 ****
  981.   {"+l",        "listFonts",    FalseArg, BooleanArg, 1,(caddr_t) &list_fonts},
  982.   {"-rv",        NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &reverse},
  983.   {"+rv",        "reverseVideo",    FalseArg, BooleanArg, 1,(caddr_t) &reverse},
  984. ! {"-sw",        NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &spec_warn},
  985. ! {"+sw",        "specialWarn",    FalseArg, BooleanArg, 1,(caddr_t) &spec_warn},
  986.   {"-bw",        NULL,        SepArg,    NumberArg, 2,    (caddr_t) &bwidth},
  987.   {"-borderwidth", "borderWidth",    SepArg,    NumberArg, 1,    (caddr_t) &bwidth},
  988.   {"-fg",        NULL,        SepArg,    StringArg, 2,    (caddr_t) &fore_color},
  989. --- 2051,2062 ----
  990.   {"+l",        "listFonts",    FalseArg, BooleanArg, 1,(caddr_t) &list_fonts},
  991.   {"-rv",        NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &reverse},
  992.   {"+rv",        "reverseVideo",    FalseArg, BooleanArg, 1,(caddr_t) &reverse},
  993. ! {"-hush",    NULL,        TrueArg, BooleanArg, 6,    (caddr_t) &hush},
  994. ! {"+hush",    "Hush",        FalseArg, BooleanArg, 5,(caddr_t) &hush},
  995. ! {"-hushspecials", NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &hush_spec},
  996. ! {"+hushspecials", "hushSpecials", FalseArg, BooleanArg, 1,(caddr_t) &hush_spec},
  997. ! {"-hushchars",    NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &hush_chars},
  998. ! {"+hushchars",    "hushLostChars", FalseArg, BooleanArg, 1,(caddr_t) &hush_chars},
  999.   {"-bw",        NULL,        SepArg,    NumberArg, 2,    (caddr_t) &bwidth},
  1000.   {"-borderwidth", "borderWidth",    SepArg,    NumberArg, 1,    (caddr_t) &bwidth},
  1001.   {"-fg",        NULL,        SepArg,    StringArg, 2,    (caddr_t) &fore_color},
  1002. ***************
  1003. *** 2032,2037 ****
  1004. --- 2075,2082 ----
  1005.   {"-icongeometry","iconGeometry",StickyArg, StringArg, 1,(caddr_t) &icon_geometry},
  1006.   {"-iconic",    NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &iconic},
  1007.   {"+iconic",    "iconic",    FalseArg, BooleanArg, 1,(caddr_t) &iconic},
  1008. + {"-keep",    NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &keep_flag},
  1009. + {"+keep",    "keepPosition",    FalseArg, BooleanArg, 1,(caddr_t) &keep_flag},
  1010.   {"-copy",    NULL,        TrueArg, BooleanArg, 2,    (caddr_t) ©},
  1011.   {"+copy",    "copy",        FalseArg, BooleanArg, 1,(caddr_t) ©},
  1012.   {"-thorough",    NULL,        TrueArg, BooleanArg, 2,    (caddr_t) &thorough},
  1013. ***************
  1014. *** 2061,2069 ****
  1015.       char    **argvend = argv + argc;
  1016.       char    *optstring;
  1017.       caddr_t    addr;
  1018. !     struct option *opt, *candidate;
  1019. !     int    len1, len2, matchlen, i;
  1020.   
  1021.       for (arg = argv + 1; arg < argvend; ++arg) {
  1022.           len1 = strlen(*arg);
  1023.           candidate = NULL;
  1024. --- 2106,2117 ----
  1025.       char    **argvend = argv + argc;
  1026.       char    *optstring;
  1027.       caddr_t    addr;
  1028. !     struct option *opt, *lastopt, *candidate;
  1029. !     int    len1, len2, matchlen;
  1030.   
  1031. +     /*
  1032. +      * Step 1.  Process command line options.
  1033. +      */
  1034.       for (arg = argv + 1; arg < argvend; ++arg) {
  1035.           len1 = strlen(*arg);
  1036.           candidate = NULL;
  1037. ***************
  1038. *** 2120,2128 ****
  1039.           case StringArg:    *((char **) addr) = optstring; break;
  1040.           case NumberArg:    *((int *) addr) = atoi(optstring); break;
  1041.           }
  1042. !         for (i = candidate->classcount; i > 0; --i)
  1043. !         (candidate++)->resource = NULL;
  1044.       }
  1045.   
  1046.   #ifndef X10
  1047.       if ((DISP = XOpenDisplay(display)) == NULL)
  1048. --- 2168,2202 ----
  1049.           case StringArg:    *((char **) addr) = optstring; break;
  1050.           case NumberArg:    *((int *) addr) = atoi(optstring); break;
  1051.           }
  1052. !         /* flag it for subsequent processing */
  1053. !         candidate->resource = (char *) candidate;
  1054.       }
  1055. +     /*
  1056. +      * Step 2.  Propagate classes for command line arguments.  Backwards.
  1057. +      */
  1058. +     for (opt = options + XtNumber(options) - 1; opt >= options; --opt)
  1059. +         if (opt->resource == (char *) opt) {
  1060. +         addr = opt->address;
  1061. +         lastopt = opt + opt->classcount;
  1062. +         for (candidate = opt; candidate < lastopt; ++candidate) {
  1063. +             if (candidate->resource != NULL) {
  1064. +             switch (opt->argtype) {
  1065. +                 case BooleanArg:
  1066. +                 *((Boolean *) candidate->address) =
  1067. +                     *((Boolean *) addr);
  1068. +                 break;
  1069. +                 case StringArg:
  1070. +                 *((char **) candidate->address) =
  1071. +                     *((char **) addr);
  1072. +                 break;
  1073. +                 case NumberArg:
  1074. +                 *((int *) candidate->address) = *((int *) addr);
  1075. +                 break;
  1076. +             }
  1077. +             candidate->resource = NULL;
  1078. +             }
  1079. +         }
  1080. +         }
  1081.   
  1082.   #ifndef X10
  1083.       if ((DISP = XOpenDisplay(display)) == NULL)
  1084. ***************
  1085. *** 2132,2137 ****
  1086. --- 2206,2214 ----
  1087.       if (XOpenDisplay(display) == NULL)
  1088.           oops("Can't open display");
  1089.   #endif
  1090. +     /*
  1091. +      * Step 3.  Handle resources (including classes).
  1092. +      */
  1093.       for (opt = options; opt < options + XtNumber(options); ++opt)
  1094.           if (opt->resource &&
  1095.   #ifndef X10
  1096. ***************
  1097. *** 2140,2161 ****
  1098.   #else
  1099.               (optstring = XGetDefault(DPY prog, opt->resource)))
  1100.   #endif
  1101. !         switch (opt->argtype) {
  1102. !             case StringArg:
  1103. !             *((char **) opt->address) = optstring;
  1104. !             break;
  1105. !             case NumberArg:
  1106. !             *((int *) opt->address) = atoi(optstring);
  1107. !             break;
  1108. !             case BooleanArg:
  1109. !             *((Boolean *) opt->address) =
  1110. !                 (strcmp(optstring, "on") == 0);
  1111.           }
  1112. -     if (!sidemargin) sidemargin = margins;
  1113. -     if (!topmargin) topmargin = margins;
  1114. -     if (!xoffset) xoffset = offsets;
  1115. -     if (!yoffset) yoffset = offsets;
  1116.   }
  1117.   
  1118.   #endif    /* TOOLKIT */
  1119. --- 2217,2237 ----
  1120.   #else
  1121.               (optstring = XGetDefault(DPY prog, opt->resource)))
  1122.   #endif
  1123. !         {
  1124. !             lastopt = opt + opt->classcount;
  1125. !             for (candidate = opt; candidate < lastopt; ++candidate)
  1126. !             if (candidate->resource != NULL) switch (opt->argtype) {
  1127. !                 case StringArg:
  1128. !                 *((char **) candidate->address) = optstring;
  1129. !                 break;
  1130. !                 case NumberArg:
  1131. !                 *((int *) candidate->address) = atoi(optstring);
  1132. !                 break;
  1133. !                 case BooleanArg:
  1134. !                 *((Boolean *) candidate->address) =
  1135. !                     (strcmp(optstring, "on") == 0);
  1136. !             }
  1137.           }
  1138.   }
  1139.   
  1140.   #endif    /* TOOLKIT */
  1141. ***************
  1142. *** 2382,2389 ****
  1143. --- 2458,2478 ----
  1144.           highGC = MakeGC(GXcopy, hl_Pixel, back_Pixel);
  1145.       }
  1146.   
  1147. + #ifndef    VMS
  1148.       ready_cursor = XCreateFontCursor(DISP, XC_cross);
  1149.       redraw_cursor = XCreateFontCursor(DISP, XC_watch);
  1150. + #else
  1151. +     DECWCursorFont = XLoadFont(DISP, "DECW$CURSOR");
  1152. +     XSetFont(DISP, foreGC, DECWCursorFont);
  1153. +     redraw_cursor = XCreateGlyphCursor(DISP, DECWCursorFont, DECWCursorFont,
  1154. +         decw$c_wait_cursor, decw$c_wait_cursor + 1,
  1155. +         &fore_color, &back_color);
  1156. +     MagnifyPixmap = XCreateBitmapFromData (DISP, RootWindowOfScreen(SCRN),
  1157. +         mag_glass_bits, mag_glass_width, mag_glass_height);
  1158. +     ready_cursor = XCreatePixmapCursor(DISP, MagnifyPixmap, MagnifyPixmap,
  1159. +         &back_color, &fore_color, mag_glass_x_hot, mag_glass_y_hot);
  1160. + #endif    /* VMS */
  1161.       if (!curs_color)
  1162.           cr_Pixel = high_color ? hl_Pixel : fore_Pixel;
  1163.       {
  1164. ***************
  1165. *** 2637,2643 ****
  1166.   #endif    /* X10 */
  1167.   
  1168.       do_pages();
  1169. ! #ifdef    lint
  1170. !     return 0;
  1171. ! #endif
  1172.   }
  1173. --- 2726,2730 ----
  1174.   #endif    /* X10 */
  1175.   
  1176.       do_pages();
  1177. !     /* NOTREACHED */
  1178.   }
  1179. diff -cr old/xdvi.h new/xdvi.h
  1180. *** old/xdvi.h    Sun Oct 21 14:49:17 1990
  1181. --- new/xdvi.h    Tue Jan 15 15:17:41 1991
  1182. ***************
  1183. *** 135,141 ****
  1184.   extern    int    maxstack;
  1185.   extern    int    n_fonts_left;        /* for LRU management of fonts */
  1186.   extern    time_t    dvi_time;        /* last mod. time for dvi file */
  1187. - extern    char    *font_path;
  1188.   extern    int    page_w, page_h;
  1189.   
  1190.   /*
  1191. --- 135,140 ----
  1192. ***************
  1193. *** 145,153 ****
  1194.   extern    long    *page_offset;
  1195.   
  1196.   /*
  1197. !  * Mechanism for reducing repeated warning about specials.
  1198.    */
  1199. ! extern    Boolean    spec_warn, spec_warn_now;
  1200.   
  1201.   
  1202.   /*
  1203. --- 144,153 ----
  1204.   extern    long    *page_offset;
  1205.   
  1206.   /*
  1207. !  * Mechanism for reducing repeated warning about specials, lost characters, etc.
  1208.    */
  1209. ! extern    Boolean    hush_spec, hush_spec_now;
  1210. ! extern    Boolean    hush_chars;
  1211.   
  1212.   
  1213.   /*
  1214. ***************
  1215. *** 202,208 ****
  1216.       struct font *next;        /* link to next font info block */
  1217.       int TeXnumber;            /* font number (in DVI file) */
  1218.       int scale;            /* scaled size in SPELL units */
  1219. -     float factor;            /* multiply char. widths by this */
  1220.       char *fontname;            /* PXL file name */
  1221.       short size;            /* dots per 5 inches */
  1222.       FILE *file;            /* open PXL file or NULL */
  1223. --- 202,207 ----
  1224. diff -cr old/xdvi_man.sed new/xdvi_man.sed
  1225. *** old/xdvi_man.sed    Sun Oct 21 14:49:31 1990
  1226. --- new/xdvi_man.sed    Sat Feb  2 16:20:39 1991
  1227. ***************
  1228. *** 9,19 ****
  1229.   .B xdvi
  1230.   .nh
  1231.   [+[\fIpage\fP]] [\-s \fIshrink\fP] [\-S \fIdensity\fP] [\-p \fIpixels\fP] [\-l]
  1232. ! [\-sw] [\-paper \fIpapertype\fP] [\-mgs[\fIn\fP] \fIsize\fP]
  1233. ! [\-altfont \fIfont\fP]
  1234.   [\-margins \fIdimen\fP] [\-sidemargin \fIdimen\fP] [\-topmargin \fIdimen\fP]
  1235.   [\-offsets \fIdimen\fP] [\-xoffset \fIdimen\fP] [\-yoffset \fIdimen\fP]
  1236. ! [\-rv] [\-fg \fIcolor\fP] [\-bg \fIcolor\fP]
  1237.   [\-hl \fIcolor\fP] [\-bd \fIcolor\fP] [\-cr \fIcolor\fP] [\-bw \fIwidth\fP]
  1238.   #ifx11
  1239.   [\-geometry \fIgeometry\fP] [\-icongeometry \fIgeometry\fP] [\-iconic]
  1240. --- 9,19 ----
  1241.   .B xdvi
  1242.   .nh
  1243.   [+[\fIpage\fP]] [\-s \fIshrink\fP] [\-S \fIdensity\fP] [\-p \fIpixels\fP] [\-l]
  1244. ! [\-paper \fIpapertype\fP] [\-mgs[\fIn\fP] \fIsize\fP]
  1245. ! [\-hushspecials] [-hushchars] [-hush] [\-altfont \fIfont\fP]
  1246.   [\-margins \fIdimen\fP] [\-sidemargin \fIdimen\fP] [\-topmargin \fIdimen\fP]
  1247.   [\-offsets \fIdimen\fP] [\-xoffset \fIdimen\fP] [\-yoffset \fIdimen\fP]
  1248. ! [\-keep] [\-rv] [\-fg \fIcolor\fP] [\-bg \fIcolor\fP]
  1249.   [\-hl \fIcolor\fP] [\-bd \fIcolor\fP] [\-cr \fIcolor\fP] [\-bw \fIwidth\fP]
  1250.   #ifx11
  1251.   [\-geometry \fIgeometry\fP] [\-icongeometry \fIgeometry\fP] [\-iconic]
  1252. ***************
  1253. *** 94,105 ****
  1254.   (%%dot%%listFonts)
  1255.   Causes the names of the fonts used to be listed.
  1256.   .TP
  1257. ! .B \-sw
  1258. ! (%%dot%%specialWarn)
  1259. ! Causes \fIxdvi\fR to warn the user when it encounters a \\special string
  1260. ! which it cannot process.  This option is on by default; to turn it off,
  1261. ! use \fB+sw\fR.
  1262.   .TP
  1263.   .B \-rv
  1264.   (%%dot%%reverseVideo)
  1265.   Causes the page to be displayed with white characters on a
  1266. --- 94,113 ----
  1267.   (%%dot%%listFonts)
  1268.   Causes the names of the fonts used to be listed.
  1269.   .TP
  1270. ! .B \-hushspecials
  1271. ! (%%dot%%hushSpecials)
  1272. ! Causes \fIxdvi\fR to suppress warnings about \\special strings
  1273. ! which it cannot process.
  1274.   .TP
  1275. + .B \-hushchars
  1276. + (%%dot%%hushLostChars)
  1277. + Causes \fIxdvi\fR to suppress warnings about references to characters which
  1278. + are not defined in the font.
  1279. + .TP
  1280. + .B \-hush
  1281. + (%%dot%%Hush)
  1282. + Causes \fIxdvi\fR to suppress all suppressable warnings.
  1283. + .TP
  1284.   .B \-rv
  1285.   (%%dot%%reverseVideo)
  1286.   Causes the page to be displayed with white characters on a
  1287. ***************
  1288. *** 159,169 ****
  1289.   Always use the \fIcopy\fR operation when writing characters to the display.
  1290.   This option may be necessary for correct operation on a color display, but
  1291.   overstrike characters will be incorrect.
  1292.   #ifbuttons
  1293.   .TP
  1294.   .B \-expert
  1295.   (.expert)
  1296. ! Prevent the buttons from appearing.
  1297.   #endif
  1298.   .TP
  1299.   .BI \-margins " dimen"
  1300. --- 167,182 ----
  1301.   Always use the \fIcopy\fR operation when writing characters to the display.
  1302.   This option may be necessary for correct operation on a color display, but
  1303.   overstrike characters will be incorrect.
  1304. + .TP
  1305. + .B \-keep
  1306. + (.keepPosition)
  1307. + Sets a flag to indicate that \fIxdvi\fR should not move to the home position
  1308. + when moving to a new page.  See also the `k' keystroke.
  1309.   #ifbuttons
  1310.   .TP
  1311.   .B \-expert
  1312.   (.expert)
  1313. ! Prevent the buttons from appearing.  See also the `x' keystroke.
  1314.   #endif
  1315.   .TP
  1316.   .BI \-margins " dimen"
  1317. ***************
  1318. *** 345,359 ****
  1319.   of the same file while running \fIxdvi\fR only once.
  1320.   .TP
  1321.   .B k
  1322. ! Normally when \fIxdvi\fR switches pages it moves to the home position as well.
  1323.   The `k' keystroke toggles a `keep-position' flag which, when set, will keep
  1324.   the same position when moving between pages.  Also `0k' and `1k' clear and
  1325. ! set this flag, respectively.
  1326.   #ifbuttons
  1327.   .TP
  1328.   .B x
  1329.   Toggles expert mode (in which the buttons do not appear).  Also `0x' and `1x'
  1330. ! clear and reset this mode, respectively.
  1331.   #endif
  1332.   .SH MOUSE ACTIONS
  1333.   If the shrink factor is set to any number other than one, then clicking
  1334. --- 358,372 ----
  1335.   of the same file while running \fIxdvi\fR only once.
  1336.   .TP
  1337.   .B k
  1338. ! Normally when \fIxdvi\fR switches pages, it moves to the home position as well.
  1339.   The `k' keystroke toggles a `keep-position' flag which, when set, will keep
  1340.   the same position when moving between pages.  Also `0k' and `1k' clear and
  1341. ! set this flag, respectively.  See also the \fB\-keep\fR option.
  1342.   #ifbuttons
  1343.   .TP
  1344.   .B x
  1345.   Toggles expert mode (in which the buttons do not appear).  Also `0x' and `1x'
  1346. ! clear and reset this mode, respectively.  See also the \fB\-expert\fR option.
  1347.   #endif
  1348.   .SH MOUSE ACTIONS
  1349.   If the shrink factor is set to any number other than one, then clicking
  1350. ***************
  1351. *** 388,393 ****
  1352. --- 401,423 ----
  1353.   If the font cannot be found at all, then \fIxdvi\fR will try to vary the point
  1354.   size of the font (within a certain range), and if this fails, then it will
  1355.   use the font specified as the alternate font (cf. \fB-altfont\fR).
  1356. + .PP
  1357. + For compatibility with TeX, you may also use ``TEXFONTS'' in place of
  1358. + ``XDVIFONTS'', although in that case the variable should not include any
  1359. + ``%'' specifiers.
  1360. + #ifsubdir
  1361. + .PP
  1362. + You can also enable recursive searching in the font path by using the ``*''
  1363. + and ``**'' specifiers.  At this point in the path, \fIxdvi\fR will recursively
  1364. + search subdirectories of the given directory in order to find font files.
  1365. + A single asterisk limits the search to one level; a double asterisk will search
  1366. + through an arbitrary number of levels.  Also, the variable TEXFONTS_SUBDIR
  1367. + can be used to give a colon-separated list of directories to recursively search.
  1368. + This is equivalent to including the specifiers with a ``*'' after each; the
  1369. + usual conventions regarding extra colons applies here, too, relative to a
  1370. + default subdirectory path.  Asterisks may not be preceded by a ``%'' specifier
  1371. + in any path component.
  1372. + #endif
  1373.   .PP
  1374.   The ``XDVISIZES'' variable must be set to indicate which sizes of fonts are
  1375.   available.  It should consists of a list of numbers separated by colons.  If
  1376. --
  1377. Dan Heller
  1378. ------------------------------------------------
  1379. O'Reilly && Associates               Zyrcom Inc
  1380. Senior Writer                   President
  1381. argv@ora.com            argv@zipcode.com
  1382.